home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / fmlbp / fmlbp.c < prev    next >
C/C++ Source or Header  |  1995-02-12  |  4KB  |  230 lines

  1. /*
  2. **  FMLBP.C    by JOUJI
  3. **
  4. **   Ver.1.00  1994.7
  5. **   Ver.1.10  1994.12 プリントファイルの最初の一行を無視しないようにした。
  6. **                     ビットイメージ印字機能の変更
  7. **
  8. **  使い方:fmlbp { file_name | /parameter } ...
  9. **
  10. **  '/'で始まる文字列はパラメーターとして扱われる。"$xx"は16進データ。
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <jctype.h>
  16.  
  17. char _asm_p();
  18.  
  19. #ifdef TOWNS
  20. /* FMR&TOWNS BIOS */
  21. #define bios_asm(x) \
  22.     _asm_p("\n\tINT\t94H\n", 0x100, _asm_p, _asm_p, (char)(x))
  23. #else
  24. /* FMV用 IBM/PC BIOS */
  25. #define bios_asm(x) \
  26.     _asm_p("\n\tMOV\tAH,0\n\tINT\t17H\n", (char)(x), _asm_p, _asm_p, 0)
  27. #endif
  28.  
  29. void print_file(char *fname);
  30. void print_cc(char *cc);
  31.  
  32. static char line[256];
  33.  
  34. main(int argc,char *argv[])
  35. {
  36.     int i;
  37.  
  38.     if (argc<2) {
  39.         puts("Parameter error !\n");
  40.         exit(1);
  41.     }
  42.     for(i=1; i<argc; i++) {
  43.         if(argv[i][0] == '/') {
  44.             print_cc(argv[i]);
  45.         } else {
  46.             print_file(argv[i]);
  47.         }
  48.     }
  49. }
  50.  
  51. char hex2char(char *p)
  52. {
  53.     char x, y, c;
  54.  
  55.     x=0;
  56.     c=toupper(*(p++));
  57.     x = (c>='0' && c<='9') ? c - '0' : c - '7';
  58.     c=toupper(*p);
  59.     y = (c>='0' && c<='9') ? c - '0' : c - '7';
  60.     x=(x << 4) + y;
  61.     return x;
  62. }
  63.  
  64. void bios_print(char c)
  65. {
  66.     char d;
  67.     union {
  68.         unsigned short w;
  69.         struct {
  70.             char l;
  71.             char h;
  72.         } b;
  73.     } ax;
  74.  
  75.     for(;;) {
  76.         ax.w = bios_asm(c);
  77. #ifdef TOWNS
  78.         if(!ax.b.h) return;
  79. #else
  80.         if(!(ax.b.h & '\x01')) return;
  81. #endif
  82.         if(kbhit()) {
  83.             d = getch();
  84.             if(d == '\x1b' || d == '\x03') exit(2);
  85.         }
  86.     }
  87. }
  88.  
  89. void bios_puts(char *p)
  90. {
  91.     for( ; *p != '\0'; p++)
  92.         bios_print(*p);
  93. }
  94.  
  95. void PrintControl(void)
  96. {
  97.     char c, s[20], *p;
  98.     int  i, bn, xb;
  99.     FILE  *fq;
  100.     union {
  101.         unsigned short w;
  102.         struct {
  103.             char l;
  104.             char h;
  105.         } b;
  106.     } x, y;
  107.  
  108.     if(line[0] == 0x03) {            /* ^C:コメント */
  109.         return;
  110.     } else if(line[0] == 0x04) {    /* ^D:ビット・イメージ2 */
  111.         for(i=1; i<255; i++) {
  112.             if(line[i] == '\n') {
  113.                 line[i] = '\0';
  114.                 break;
  115.             }
  116.         }
  117.         if( (fq=fopen(&line[1], "rb")) == NULL) {
  118.             puts("File not exist !\n");
  119.             return;
  120.         }
  121.         x.b.l=fgetc(fq);
  122.         x.b.h=fgetc(fq);
  123.         y.b.l=fgetc(fq);
  124.         y.b.h=fgetc(fq);
  125.         xb = x.w % 8 ? x.w/8 + 1 : x.w / 8;
  126.         bn = xb * y.w;
  127.         sprintf(s,"\x1bQ%d;%d;0!a", bn, x.w);
  128.         bios_puts(s);
  129.         while((i=fgetc(fq)) != EOF)
  130.             bios_print(i);
  131.         fclose(fq);
  132.     } else if(line[0] == 0x05) {    /* ^E:16進データ */
  133.         for(p = line + 1; *p != '\n'; p += 2) {
  134.             c = hex2char(p);
  135.             bios_print(c);
  136.         }
  137.     } else if(line[0] == 0x06) {    /* ^F:ビット・イメージ1 */
  138.         for(i=1; i<255; i++) {
  139.             if(line[i] == '\n') {
  140.                 line[i] = '\0';
  141.                 break;
  142.             }
  143.         }
  144.         if( (fq=fopen(&line[1], "rb")) == NULL) {
  145.             puts("File not exist !\n");
  146.             return;
  147.         }
  148.         while((i=fgetc(fq)) != EOF)
  149.             bios_print(i);
  150.         fclose(fq);
  151.     } else {
  152.         for(i=0; i<255; i++) {
  153.             c = line[i];
  154.             if(c == '\n' || c == '\0')
  155.                 break;
  156.             bios_print(c);
  157.         }
  158.     }
  159. }
  160.  
  161. void PrintLine(void)
  162. {
  163.     char c, d;
  164.     int  i;
  165.     union {
  166.         unsigned short w;
  167.         struct {
  168.             char l;
  169.             char h;
  170.         } b;
  171.     } sjis, jis;
  172.  
  173.     for(i=0; i<255; i++) {
  174.         c = line[i];
  175.         if(c == '\n' || c == '\0')
  176.             break;
  177.         if( (c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xff) ) {
  178.             d = line[++i];
  179.             if(d == '\n' || d == '\0') break;
  180.             sjis.b.h = c;
  181.             sjis.b.l = d;
  182.             jis.w = mstojis(sjis.w);
  183.             bios_print(jis.b.h);
  184.             bios_print(jis.b.l);
  185.         } else if(c >= 0xa0) {
  186.             bios_print(0x2e);
  187.             bios_print(c - 0x80);
  188.         } else if(c >= 0x20) {
  189.             bios_print(0x2d);
  190.             bios_print(c);
  191.         } else {
  192.             bios_print(c);
  193.         }
  194.     }
  195. }
  196.  
  197. void print_file(char *fname)
  198. {
  199.     FILE *fp;
  200.  
  201.     if( (fp=fopen(fname,"r")) == NULL) {
  202.         puts("File not exist !\n");
  203.         return;
  204.     }
  205. /*    fgets(line, 256, fp); */ /* ファイルの最初の一行無視 */
  206.     while( fgets(line, 256, fp) != NULL) {
  207.         if(line[0] <= 0x1f) {
  208.             PrintControl();
  209.         }
  210.         else {
  211.             PrintLine();
  212.         }
  213.     }
  214.     fclose(fp);
  215. }
  216.  
  217. void print_cc(char *p)
  218. {
  219.     char c;
  220.  
  221.     for( p++; *p != '\0'; p++ ) {
  222.         c = *p;
  223.         if( c == '$' ) {
  224.             c = hex2char(++p);
  225.             p++;
  226.         }
  227.         bios_print(c);
  228.     }
  229. }
  230.